package lei.g_java数组.排序;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @className: Main
 * @author: xl
 * @date: 2025/7/19 07:32
 * @Version: 1.0
 * @description:
 */

public class Main {

    public static void main(String[] args) {

        // 修复方案：禁用 ASM 优化
        //这是 FastJSON 在处理包含非 ASCII 字符（如中文）的类名/包名时的常见问题。以下是修复方案：
        ParserConfig.getGlobalInstance().setAsmEnable(false);


        String stus = "[{\"name\":\"e张三\",\"age\":44,\"score\":95},{\"name\":\"d李四\",\"age\":11,\"score\":94},{\"name\":\"c小王\",\"age\":33,\"score\":90},{\"name\":\"b老王\",\"age\":13,\"score\":88},{\"name\":\"a王五\",\"age\":14,\"score\":84}]";



       List<Students> students = JSON.parseArray(stus, Students.class);

        System.out.println( "不进行排序:  "+students);


        // 按 age 降序排序（方案1：使用 Collections.sort）
        Collections.sort(students, Comparator.comparingInt(Students::getAge).reversed());

        System.out.println("按名年龄进行降序：  "+students);


        // 按 age 降序排序（方案2：使用 Stream）
        /**
         * 原错误代码： sorted(Students::getAge).reversed() ❌ 问题：Students::getAge 是实例方法引用，不能直接用于 sorted() 参数，且 reversed() 不能作用于 Stream。
         * 修复后代码： sorted(Comparator.comparingInt(Students::getAge).reversed()) ✅ 修复：
         * 用 Comparator.comparingInt() 包装方法引用，生成合法的比较器
         * 在 Comparator 上调用 reversed() 实现降序
         * 保持流操作链的完整性
         */
//        List<Students> sortedStudents1 = students.stream()
//                .sorted(Students::getAge).reversed()
//                .collect(Collectors.toList());
//
//        System.out.println(sortedStudents1);


        // 按 age 降序排序（方案2：使用 Stream）
        List<Students> sortedStudents1 = students.stream()
                .sorted(Comparator.comparingInt(Students::getAge).reversed())
                .collect(Collectors.toList());

        System.out.println("按名年龄进行降序:    "+sortedStudents1);


        // 按 age 降序排序（方案2：使用 Stream）
        List<Students> sortedStudents2 = students.stream()
                .sorted(Comparator.comparing((s)->s.getAge()))
                .collect(Collectors.toList());

        System.out.println("按名名字进行升序:    "+sortedStudents2);



        // TreeMap 示例：按 key 排序的 Map

        TreeMap<String, Integer> treeMap = new TreeMap<>();
        treeMap.put("Banana", 3);
        treeMap.put("Apple", 5);
        treeMap.put("Orange", 2);
        treeMap.put("Grape", 4);

        System.out.println("TreeMap 内容（按键排序）：");
        for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + " => " + entry.getValue());
        }


        // 按 value 排序 TreeMap
        // 将 TreeMap 的键值对转换为 List 并按 value 进行升序排序
        List<Map.Entry<String, Integer>> list = new ArrayList<>(treeMap.entrySet());
        list.sort(Map.Entry.comparingByValue());

        System.out.println("\nTreeMap 内容（按 value 升序排序）：");
        for (Map.Entry<String, Integer> entry : list) {
            System.out.println(entry.getKey() + " => " + entry.getValue());
        }


        // TreeSet 示例：自动排序的 Set
        TreeSet<Integer> treeSet = new TreeSet<>();
        treeSet.add(10);
        treeSet.add(5);
        treeSet.add(15);
        treeSet.add(7);

        System.out.println("\nTreeSet 内容（自动排序）：");
        for (Integer num : treeSet) {
            System.out.println(num);
        }



        // 使用 HashMap（无序键值对）
        Map<String, Integer> hashMap = new HashMap<>();
        hashMap.put("Alice", 25);
        hashMap.put("Bob", 30);
        hashMap.put("Charlie", 28);
        Map<String, Object> map1=Map.of("name","XL","age",20);

        HashMap<String, Object> map2=new HashMap<>(map1);
        TreeMap<String ,Object>  map3=new TreeMap<>(map1);

        System.out.println(map2);
        System.out.println(map3);



    }
}

